function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
/**
 * 加载子应用
 * @see https://qiankun.umijs.org/zh/api#registermicroappsapps-lifecycles
 */
export var getQiankunConfig = function getQiankunConfig(apps) {
  var DeployEnv = !process.env.DEPLOY_ENV || process.env.DEPLOY_ENV === '/local' ? '/dev' : "/".concat(process.env.DEPLOY_ENV);
  var microApps = _toConsumableArray(apps !== null && apps !== void 0 ? apps : []);
  console.log('[drs] 本地注册的微应用包含：', microApps);
  return Promise.resolve({
    /** 注册的子应用 */
    apps: microApps.map(function (microApp) {
      return {
        name: microApp.name,
        entry: microApp.entry
      };
    }),
    /** 子应用路径 */
    routes: microApps.map(function (microApp) {
      return {
        path: "/".concat(microApp.name),
        microApp: microApp.name,
        microAppProps: {
          /** 自动设置微应用的加载状态 */
          autoSetLoading: true,
          /** 自动设置微应用的错误捕获 */
          autoCaptureError: true
        }
      };
    }),
    /** 在第一个微应用 mount 完成后开始预加载其他微应用的静态资源 */
    prefetch: true,
    /** 若采用 strictStyleIsolation 样式严格隔离，shadow-dom 机制会导致 createPortal 创建的节点缺失样式 */
    sandbox: {},
    lifeCycles: {
      beforeLoad: function beforeLoad(app) {
        console.log('[drs] ' + app.name + ' 子应用加载前', app);
      },
      beforeMount: function beforeMount(app) {
        console.log('[drs] ' + app.name + ' 子应用挂载前', app);
      },
      afterMount: function afterMount(app) {
        console.log('[drs] ' + app.name + ' 子应用挂载后', app);
      },
      beforeUnmount: function beforeUnmount(app) {
        console.log('[drs] ' + app.name + ' 子应用卸载前', app);
      },
      afterUnmount: function afterUnmount(app) {
        console.log('[drs] ' + app.name + ' 子应用卸载后', app);
      }
    },
    /**
     * getPublicPath 影响子应用除 umi.js、umi.css 之外的资源加载路径
     * chunk 资源直接根据 html 访问地址查找
     * @param entry 子应用 html 访问地址
     * @returns
     */
    getPublicPath: function getPublicPath(entry) {
      var lastIndex = entry.indexOf('index.html');
      var microApp = microApps.find(function (app) {
        return app.entry === entry;
      });
      var publicPath = entry.slice(0, lastIndex);
      console.log('[drs] ' + (microApp === null || microApp === void 0 ? void 0 : microApp.name) + ' 子应用 chunk 资源加载路径：', publicPath);

      /**
       * @todo 地址中是否携带 '/'，与机器无关，疑与环境有关
       */
      return publicPath !== null && publicPath !== void 0 && publicPath.endsWith('/') ? publicPath : publicPath + '/';
    },
    /**
     * getTemplate 影响 umi.js、umi.css 等入口文件的加载路径
     * 支持子应用不设置 publicPath
     * @param 子应用 html 字符串内容
     * @returns
     */
    getTemplate: function getTemplate(tpl) {
      var _tpl$match;
      /** 子应用模板 window.routerBase 变量由 preset-subapp 注入 */
      var RouteBaseRegExp = /window.routerBase\s*=\s*\"[\/]*([a-z-]*)\"/;
      // 子应用标识符
      var microAppName = (_tpl$match = tpl.match(RouteBaseRegExp)) === null || _tpl$match === void 0 ? void 0 : _tpl$match[1];
      console.log('[drs] 从子应用 html 解析出的应用标识为：' + microAppName);
      var entryRegExp = /[^\"]*\/umi(\.[a-zA-Z0-9]*)?\.((js)|(css))/g;
      var microApp = microApps.find(function (app) {
        return app.name === microAppName;
      });
      var _ref = microApp !== null && microApp !== void 0 ? microApp : {},
        useRuntimePublic = _ref.useRuntimePublic;
      if (!microAppName || !microApp || !useRuntimePublic) {
        console.log('[drs] ' + (microApp === null || microApp === void 0 ? void 0 : microApp.name) + ' 子应用 entry 资源加载路径将使用子应用 html 内容');
        return tpl;
      }

      // 基于约定，子应用 umi.js 及 html 放在同一个静态服务器中
      var baseUrl = microApp.entry.indexOf('/index.html') !== -1 ? microApp.entry.slice(0, microApp.entry.indexOf('/index.html')) : microApp.entry;

      /**
       * 添加协议。远程资源无协议会通过相对路径查找，即便 '//' 起始
       */
      baseUrl = baseUrl.indexOf('http') === 0 ? baseUrl : location.protocol + baseUrl;
      var result = tpl.replace(entryRegExp, function ($0) {
        console.log('[drs] ' + (microApp === null || microApp === void 0 ? void 0 : microApp.name) + ' 子应用 entry 资源加载路径：', baseUrl + $0);
        return baseUrl + $0;
      });
      console.log('[drs] ' + (microApp === null || microApp === void 0 ? void 0 : microApp.name) + ' 子应用 html 实际使用内容' + result);
      return result;
    }
  });
};

/**
 * 运行时动态追加菜单
 * @param menus
 */
export var patchSlaveMenus = function patchSlaveMenus(_ref2) {
  var menus = _ref2.menus,
    apps = _ref2.apps;
  (apps !== null && apps !== void 0 ? apps : []).forEach(function (microApp) {
    if (microApp.menu && !menus.some(function (menu) {
      return menu.key === microApp.name;
    })) {
      menus.push({
        key: microApp.name,
        path: microApp.to ? microApp.to : "/".concat(microApp.name),
        menu: microApp.menu,
        title: microApp.title
      });
    }
  });
};